using System;
using System.Data;
using MySql.Data.MySqlClient;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;
using Novapangeia.Dominio;

namespace Novapangeia.Repositorio
{	
	public partial class RepositorioUnidade
	{	   
		
		private ISqlHelper sqlHelper;
		
		public  RepositorioUnidade(ISqlHelper _sqlHelper)
        {
            if (_sqlHelper == null)
                sqlHelper = new SqlHelper();
            else
                sqlHelper = _sqlHelper;
        }
		
		#region Parameters
		public static class Parameters
		{
			public static MySqlParameter Id
			{
				get
				{
					return new MySqlParameter("p_Id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Tropa_id
			{
				get
				{
					return new MySqlParameter("p_Tropa_id", MySqlDbType.Int32, 0);
				}
			}
			
			public static MySqlParameter Tipo
			{
				get
				{
					return new MySqlParameter("p_Tipo", MySqlDbType.Byte, 0);
				}
			}
			
			public static MySqlParameter Quantidade
			{
				get
				{
					return new MySqlParameter("p_Quantidade", MySqlDbType.Int32, 0);
				}
			}
			
		}
		#endregion		
		
		//=================================================================
		//  Carrega todas as unidades pela id da tropa a que pertencem
		//=================================================================
		public List<Unidade> ListarUnidadesPorTropaId(int tropaId) 
		{
            string sql = @"SELECT id, tropa_id, tipo, quantidade FROM unidade where tropa_id = @p_Tropa_id";

            MySqlParameter p;
            p = Parameters.Tropa_id;
            p.Value = tropaId;
			MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p }, CommandBehavior.SingleRow);

            List<Unidade> entityList = new List<Unidade>();
			Unidade entity;
			
			while (reader.Read())
            {
                entity = preencherUnidade(reader);
				entityList.Add(entity);
            }

            reader.Close();
			
			return entityList;
		}

	
		//=================================================================
		//  Carrega apenas um registro, buscado pela chave primária
		//=================================================================
		public Unidade ConsultarPorId(uint Id)
		{
            string sql = @"SELECT id, tropa_id, tipo, quantidade FROM unidade WHERE (id = @p_id)";

			MySqlParameter p;
			p = Parameters.Id;
			p.Value = Id;

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, new MySqlParameter[] { p }, CommandBehavior.SingleRow);
			
			Unidade entity = new Unidade(new Unidade.TipoUnidade(), 0);
			
			if(reader.HasRows)
            {
				reader.Read();
				entity = preencherUnidade(reader);
            }
            else
            {
                entity = null;
            }

            reader.Close();
			
			return entity;
		}

        public Unidade ConsultarPorTropaIdePorTipo(int tropaId, Unidade.TipoUnidade tipo)
        {
            string sql = @"SELECT id, tropa_id, tipo, quantidade FROM unidade WHERE (tropa_id = @p_Tropa_id and tipo = @p_tipo);";
            List<MySqlParameter> parameters = new List<MySqlParameter>();

            MySqlParameter p;
            p = Parameters.Tropa_id;
            p.Value = tropaId;
            parameters.Add(p);

            p = Parameters.Tipo;
            p.Value = tipo;
            parameters.Add(p);

            MySqlDataReader reader = sqlHelper.ExecuteReader(CommandType.Text, sql, parameters.ToArray());

            Unidade saida = new Unidade();

            if (reader.HasRows)
            {
                reader.Read();
                saida = preencherUnidade(reader);
            }
            else
            {
                saida = null;
            }

            reader.Close();

            return saida;
        }
		
        private Unidade preencherUnidade(MySqlDataReader  r)
        {
            Unidade novaUnidade = new Unidade((Unidade.TipoUnidade)r.GetByte("Tipo"),r.GetInt32("Quantidade"));
			
			novaUnidade.id = r.GetInt32("Id");

			novaUnidade.tropaId= r.GetInt32("Tropa_id");

            return novaUnidade;
        }
	
		public void CadastrarUnidade(Unidade unidade)
		{
            string sql = @"INSERT
	                        INTO unidade
	                        (
		                        tropa_id,
		                        tipo,
		                        quantidade
	                        )
	                        VALUES
	                        (
		                        @p_tropa_id,
		                        @p_tipo,
		                        @p_quantidade
	                        )";

			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;

			p = Parameters.Tropa_id;
		    p.Value = unidade.tropaId;
			parameters.Add(p);

			p = Parameters.Tipo;
			p.Value = unidade.tipo;
			parameters.Add(p);

			p = Parameters.Quantidade;
			p.Value = unidade.Quantidade;
			parameters.Add(p);


            sqlHelper.ExecuteSqlWithOutputParams(CommandType.Text, sql, parameters.ToArray());
		}
	
		public bool atualizarUnidade(Unidade unidade)
		{
            string sql = @"UPDATE unidade
	                        SET
		                        tropa_id = @p_tropa_id,
		                        tipo = @p_tipo,
		                        quantidade = @p_quantidade
	                        WHERE
		                        id = @p_id";

			List<MySqlParameter> parameters = new List<MySqlParameter>();
			
			MySqlParameter p;
			
			p = Parameters.Id;
			p.Value = unidade.id;
			parameters.Add(p);

			p = Parameters.Tropa_id;
			p.Value = unidade.tropaId;
			parameters.Add(p);

			p = Parameters.Tipo;
			p.Value = unidade.tipo;
			parameters.Add(p);

			p = Parameters.Quantidade;
			p.Value = unidade.Quantidade;
			parameters.Add(p);


            return sqlHelper.ExecuteSql(CommandType.Text, sql, parameters.ToArray());	
		}
	
		public bool Delete(Unidade entity)
		{
            string sql = @"UPDATE unidade
	                        SET
		                        tropa_id = @p_tropa_id,
		                        tipo = @p_tipo,
		                        quantidade = @p_quantidade
	                        WHERE
		                        id = @p_id";

			MySqlParameter p;
			p = Parameters.Id;
			p.Value = entity.id;

            return sqlHelper.ExecuteSql(CommandType.Text, sql, new MySqlParameter[] { p });	
		}
		
	}
}
